/*
 * @Descripttion : 校验方法（内部校验）
 * @Author       : QianFox Team
 * @Date         : 2022-03-10 16:19:28
 * @LastEditors  : QianFox Team
 * @LastEditTime : 2022-04-19 09:49:26
 */

import { _isIntNum, _typeOf } from './utils';

/**
 * @description: 校验RGB值是否合法
 * @param {*} rgb
 * @param {*} key
 * @param {*} isThrow
 * @return {*}
 * @Date: 2022-04-13 14:55:31
 */
function _checkRGB(rgb, isThrow, key) {
    let str = rgb.slice(4, rgb.length - 1),
        arry = str.split(','),
        status = true,
        reg = /^rgb\(\d{1,3},\s{0,1}\d{1,3},\s{0,1}\d{1,3}\)$/;

    arry.forEach(function (item) {
        if (Number(item.trim()) < 0 || Number(item.trim()) > 255) {
            status = false;
        }
    });

    if (reg.test(rgb) && status) {
        return true;
    } else {
        if (isThrow) {
            throw new Error(`${key || ''}只能是rgb值, 如: rgb(255,255,255)！`);
        } else {
            return false;
        }
    }
}

/**
 * @description: 校验RGBA值是否合法
 * @param {*} rgba
 * @param {*} key
 * @param {*} isThrow
 * @return {*}
 * @Date: 2022-04-13 14:54:49
 */
function _checkRGBA(rgba, isThrow, key) {
    let str = rgba.slice(5, rgba.length - 1),
        arry = str.split(','),
        status = true,
        reg = /^rgba\(\d{1,3}(\,\s{0,1}\d{1,3}){2}\,\s{0,1}(0|(0(\.\d{1,2}))|1)\)$/;

    arry.forEach(function (item, index) {
        if (index == arry.length - 1) {
            if (Number(item.trim()) < 0 || Number(item.trim()) > 1) {
                status = false;
            }
        } else {
            if (Number(item.trim()) < 0 || Number(item.trim()) > 255) {
                status = false;
            }
        }
    });

    if (reg.test(rgba) && status) {
        return true;
    } else {
        if (isThrow) {
            throw new Error(`${key || ''}只能是rgba值, 如: rgba(255,255,255,0.6)！`);
        } else {
            return false;
        }
    }
}

/**
 * @description: 校验 url 地址是否合法
 * @param {*} url
 * @param {*} isThrow
 * @param {*} key
 * @return {*}
 * @Date: 2022-04-19 09:48:55
 */
function _verificationUrl(url, isThrow, key) {
    let reg = /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/;
    if (reg.test(url)) {
        return true;
    } else {
        if (isThrow) {
            throw new Error(`${key || ''} 不是一个合法的url地址！`);
        } else {
            return false;
        }
    }
}

/**
 * @description: 校验 el
 * @param {*} el
 * @param {*} isThrow
 * @return {*}
 * @Date: 2021-11-23 22:35:13
 */
function _verificationEl(el, isThrow, key) {
    if (el) {
        return true;
    } else {
        if (isThrow) {
            throw new Error(`${key || ''} 值需是dom节点！`);
        } else {
            return false;
        }
    }
}

/**
 * @description: 校验 item 是不是 itemList 中的一个值
 * @param {*} item
 * @param {*} key
 * @param {*} isThrow
 * @return {*}
 * @Date: 2021-11-23 22:34:40
 */
function _verificationItem(item, itemList, isThrow, key) {
    if (item && itemList.indexOf(item) === -1) {
        if (isThrow) {
            throw new Error(`${key || ''} 值需是${itemList.join('、')}其中一个！`);
        } else {
            return false;
        }
    } else {
        return true;
    }
}

/**
 * @description: 校验是不是布尔值
 * @param {*} bool
 * @param {*} key
 * @param {*} isThrow
 * @return {*}
 * @Date: 2021-11-23 22:31:32
 */
function _verificationIsBool(bool, isThrow, key) {
    if (bool && _typeOf(bool) !== 'boolean') {
        if (isThrow) {
            throw new Error(`${key || ''} 只能是布尔值！`);
        } else {
            return false;
        }
    } else {
        return true;
    }
}

/**
 * @description: 校验 arr 是不是数组
 * @param {*} arr
 * @param {*} isThrow
 * @param {*} key
 * @return {*}
 * @Date: 2022-04-16 22:10:48
 */
function _verificationIsArray(arr, isThrow, key) {
    if (_typeOf(arr) === 'array') {
        return true;
    } else {
        if (isThrow) {
            throw new Error(`${key || ''} 只能是数组！`);
        } else {
            return false;
        }
    }
}

/**
 * @description: 校验 obj 是不是对象
 * @param {*} obj
 * @param {*} isThrow
 * @param {*} key
 * @return {*}
 * @Date: 2022-04-18 20:10:58
 */
function _verificationIsObject(obj, isThrow, key) {
    if (_typeOf(obj) === 'object') {
        return true;
    } else {
        if (isThrow) {
            throw new Error(`${key || ''} 只能是对象！`);
        } else {
            return false;
        }
    }
}

/**
 * @description: 校验 intOdd 是不是正整数的奇数
 * @param {*} intOdd
 * @param {*} key
 * @param {*} isThrow
 * @return {*}
 * @Date: 2021-11-23 22:28:48
 */
function _verificationIntOdd(intOdd, isThrow, key) {
    if ((intOdd || intOdd == 0) && (!_isIntNum(intOdd) || parseInt(intOdd) % 2 == 0)) {
        if (isThrow) {
            throw new Error(`${key || ''} 只能取正整数的奇数`);
        } else {
            return false;
        }
    } else {
        return true;
    }
}

/**
 * @description: 是不是正整数
 * @param {*} int
 * @param {*} key
 * @param {*} isThrow
 * @return {*}
 * @Date: 2021-11-23 13:17:06
 */
function _verificationInt(int, isThrow, key) {
    if (!_isIntNum(int)) {
        if (isThrow) {
            throw new Error(`${key || ''} 只能是正整数！`);
        } else {
            return false;
        }
    } else {
        return true;
    }
}

/**
 * @description: 校验 pageSize
 * @param {*} pageSize
 * @param {*} pageSizeList
 * @param {*} key
 * @param {*} isThrow
 * @return {*}
 * @Date: 2021-11-23 13:15:21
 */
function _verificationPageSize(pageSize, pageSizeList, isThrow, key) {
    if ((pageSize || pageSize == 0) && pageSizeList.indexOf(pageSize) === -1) {
        if (isThrow) {
            throw new Error(`${key || ''} 取值范围${pageSizeList.join('、')}其中一个`);
        } else {
            return false;
        }
    } else {
        return true;
    }
}

/**
 * @description: 校验 callback
 * @param {*} callback
 * @param {*} key
 * @param {*} isThrow
 * @return {*}
 * @Date: 2021-11-23 22:25:56
 */
function _verificationCallback(callback, isThrow, key) {
    if (callback && _typeOf(callback) !== 'function') {
        if (isThrow) {
            throw new Error(`${key || 'callback'} 传入必须是一个函数！`);
        } else {
            return false;
        }
    } else {
        return true;
    }
}

export {
    _checkRGBA,
    _checkRGB,
    _verificationUrl,
    _verificationEl,
    _verificationItem,
    _verificationIsBool,
    _verificationIsArray,
    _verificationIsObject,
    _verificationIntOdd,
    _verificationInt,
    _verificationPageSize,
    _verificationCallback,
};
